package com.endesa.arqame4j.parqweb.servicios;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.endesa.arqame4j.parqweb.model.Mensaje;

public class MensajesServicioMock implements MensajesServicio {

	private HashMap<Long, Mensaje> cache;
	private static int NUM_MENSAJES = 15;
	private static Log log = LogFactory.getFactory().getInstance(
			MensajesServicioMock.class);

	/**
	 *
	 */
	public MensajesServicioMock() {
		super();
		inicializarLista();
	}

	/* (non-Javadoc)
	 * @see com.endesa.arqame4j.parqweb.servicios.ServicioAcme#actualizar(java.lang.Object)
	 */
	public void actualizar(Object entidad) {
		validarNoNulo(entidad);
		Mensaje mensajeAActualizar = (Mensaje) entidad;
		cache.get(mensajeAActualizar.getId()).setDescripcion(
				mensajeAActualizar.getDescripcion());
	}

	/**
	 * @param entidad
	 */
	private void validarNoNulo(Object entidad) {
		if (entidad == null) {
			throw new IllegalArgumentException(
					"La entidad parametro no puede ser nula");
		}
	}

	/* (non-Javadoc)
	 * @see com.endesa.arqame4j.parqweb.servicios.MensajesServicio#consultarPorDesc(java.lang.String)
	 */
	public Collection consultarPorDesc(String desc) {
		List<Mensaje> mensajesADevolver = new ArrayList<Mensaje>();
		for (Mensaje m : cache.values()) {
			if (m.getDescripcion().equalsIgnoreCase(desc)) {
				mensajesADevolver.add(m);
			}
		}
		return mensajesADevolver;
	}

	/* (non-Javadoc)
	 * @see com.endesa.arqame4j.parqweb.servicios.MensajesServicio#consultarPorFecha(java.util.Date)
	 */
	public Collection consultarPorFecha(Date fecha) {
		List<Mensaje> mensajesADevolver = new ArrayList<Mensaje>();
		SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy");

		for (Mensaje m : cache.values()) {
			if (formateador.format(m.getFecha()).equals(
					formateador.format(fecha))) {
				mensajesADevolver.add(m);
			}
		}
		return mensajesADevolver;
	}

	/* (non-Javadoc)
	 * @see com.endesa.arqame4j.parqweb.servicios.ServicioAcme#eliminar(java.lang.Object)
	 */
	public void eliminar(Object entidad) {
		validarNoNulo(entidad);
		Mensaje mensajeAEliminar = (Mensaje) entidad;
		cache.remove(mensajeAEliminar.getId());
	}

	/* (non-Javadoc)
	 * @see com.endesa.arqame4j.parqweb.servicios.ServicioAcme#insertar(java.lang.Object)
	 */
	public void insertar(Object entidad) {
		validarNoNulo(entidad);
		Mensaje mensajeAInsertar = (Mensaje) entidad;
		log.info("*** En insertar de MOCK  objeto=" + mensajeAInsertar.getDescripcion());
		Long id = System.currentTimeMillis();
		mensajeAInsertar.setId(id);
		Date fecha = GregorianCalendar.getInstance().getTime();
		mensajeAInsertar.setFecha(fecha);
		cache.put(id, mensajeAInsertar);
	}

	/* (non-Javadoc)
	 * @see com.endesa.arqame4j.parqweb.servicios.ServicioAcme#consultar(java.lang.Object[])
	 */
	public Collection consultar(Object... objeto) {
		List<Mensaje> mensajesADevolver = new ArrayList<Mensaje>();
		log.info("*** En metodo consultar  objeto=" + objeto );

		if (objeto != null && objeto.length != 0) {
			log.info("*** objeto.length=" + objeto.length  );
			for (Object o : objeto) {
				for (Mensaje m : cache.values()) {
					if (m.equals(o)) {
						mensajesADevolver.add(m);
					}
				}
			}
		} else {
			log.info("*** En metodo consultar, se regresa TODA la lista");
			return new ArrayList(cache.values());
		}
		return mensajesADevolver;
	}

	/* (non-Javadoc)
	 * @see com.endesa.arqame4j.parqweb.servicios.ServicioAcme#consultarPorId(java.lang.Long)
	 */
	public Object consultarPorId(Long id) {
		for (Mensaje m : cache.values()) {
			if (m.getId().compareTo(id) == 0) {
				return m;
			}
		}
		return null;
	}

	/**
	 *
	 */
	private void inicializarLista() {
		cache = new HashMap<Long, Mensaje>();
		log.info("*** En metodo inicializarLista() ");
		for (int i = 0; i < NUM_MENSAJES; i++) {
			Mensaje m = new Mensaje(Long.valueOf(i), "Mensaje " + i, Calendar
					.getInstance().getTime());
			cache.put(m.getId(), m);
		}
		log.info("*** HashMap con " + cache.size() + " elementos");
	}
}
